#ifndef TAGS_H
#define TAGS_H

#include "scm.h"

typedef enum {
  // atomic types
  tag_atom = 0,
  tag_numb = 1,
  
  // pointer types
  tag_cons = 2,
  tag_clos = 3,
  tag_vect = 4,
  tag_strn = 5,
} tag;

typedef enum {
  atom_tag_fals = 0,
  atom_tag_true = 0b001000,
  atom_tag_null = 0b010000,
  atom_tag_symb = 0b011000,
  atom_tag_char = 0b100000,
} atom_tag;

scm scm_get_tag(scm s);

scm mk_fals();
scm mk_true();
scm mk_bool(scm b);
scm mk_null();
scm mk_symb(scm id);
scm mk_char(char ch);
scm mk_numb(num nm);
scm mk_cons(scm *p);
scm mk_clos(scm *p);
scm mk_vect(scm *p);
scm mk_strn(scm *p);

scm get_symb(scm s);
char get_char(scm s);
num get_numb(scm s);
scm *get_cons(scm s);
scm get_cons_car(scm s);
scm get_cons_cdr(scm s);
void set_cons_car(scm s, scm x);
void set_cons_cdr(scm s, scm x);

scm *get_clos(scm s);
scm *get_vect(scm s);
scm *get_strn(scm s);
scm get_strn_len(scm s);
unsigned char *get_strn_data(scm s);
  
scm clos_lbl(scm clo);
scm clos_env_ref(scm clo, scm idx);
void clos_set_env(scm clo, scm idx, scm obj);

#endif
